package validator

import (
	"fmt"
	"gin-blog/utils/msg"
	"github.com/go-playground/locales/zh_Hans_CN"
	uniTrans "github.com/go-playground/universal-translator"
	"github.com/go-playground/validator/v10"
	zhTrans "github.com/go-playground/validator/v10/translations/zh"
	"reflect"
)

// Validator 获取结构体数据，与结构体中设定的validator进行校验
func Validator(data interface{}) (string, int) {
	// 校验器
	validate := validator.New()
	// 中文翻译器
	uni := uniTrans.New(zh_Hans_CN.New())
	trans, _ := uni.GetTranslator("zh_Hans_CN")
	// 注册翻译器到校验器
	err := zhTrans.RegisterDefaultTranslations(validate, trans)

	if err != nil {
		fmt.Println("Validator err", err)
	}
	// 自定义约束标签
	validate.RegisterTagNameFunc(func(field reflect.StructField) string {
		label := field.Tag.Get("label")
		return label
	})
	// data转换为Struct，因为指导传过来的data是一个Struct，所以不需要进行断言
	err = validate.Struct(data)
	if err != nil {
		for _, v := range err.(validator.ValidationErrors) {
			return v.Translate(trans), msg.ERROR_DATA_CHECK
		}
	}
	return "", msg.SUCCESS
}
